gesture: Prevent against sequence cancellation within gtk_gesture_set_state()
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 7 May 2014 09:18:00 +0000 (11:18 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 23 May 2014 17:54:29 +0000 (19:54 +0200)
Sequences may be cancelled within the ::sequence-state-changed handler, which
would change the points hashtable as it's being iterated in this function. So
iterate over a list of sequences and let the hashtable change freely.

gtk/gtkgesture.c

index 8a8de71c8934fc80b96e4b99a97950c258c02467..420ad9ffa32676dbdb964170969345407591ada1 100644 (file)
@@ -845,20 +845,21 @@ gboolean
 gtk_gesture_set_state (GtkGesture            *gesture,
                        GtkEventSequenceState  state)
 {
-  GdkEventSequence *sequence;
   gboolean handled = FALSE;
   GtkGesturePrivate *priv;
-  GHashTableIter iter;
+  GList *sequences, *l;
 
   g_return_val_if_fail (GTK_IS_GESTURE (gesture), FALSE);
   g_return_val_if_fail (state >= GTK_EVENT_SEQUENCE_NONE &&
                         state <= GTK_EVENT_SEQUENCE_DENIED, FALSE);
 
   priv = gtk_gesture_get_instance_private (gesture);
-  g_hash_table_iter_init (&iter, priv->points);
+  sequences = g_hash_table_get_keys (priv->points);
 
-  while (g_hash_table_iter_next (&iter, (gpointer*) &sequence, NULL))
-    handled |= gtk_gesture_set_sequence_state (gesture, sequence, state);
+  for (l = sequences; l; l = l->next)
+    handled |= gtk_gesture_set_sequence_state (gesture, l->data, state);
+
+  g_list_free (sequences);
 
   return handled;
 }